package priv.lirenhe.dissertation.bdb.url_queue;

import java.io.File;
import java.util.List;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;

import priv.lirenhe.dissertation.bdb.BdbPersistentQueue;
import priv.lirenhe.dissertation.bdb.util.ProjectPath;

public class NotUsedUrlQueue {
	
	private BdbPersistentQueue<String> notUsedUrlQueueVar = null;
	
	public NotUsedUrlQueue(){
		String bdbDir = null;
		String bdbName = "notUsedUrlQueue";
		try {
			PropertiesConfiguration propConfig = new PropertiesConfiguration();
			propConfig.setEncoding("UTF-8");
			propConfig.load("bdb.properties");
			bdbDir = (String) propConfig.getProperty("bdbDir");
			if(bdbDir == null){
				bdbDir = ProjectPath.getFolderPathInProject("bdb");
				System.out.println("NotUsedUrlQueue bdbDir="+bdbDir);
			}
			File file = new File(bdbDir);
			if(!file.exists()){
				file.mkdirs();
			}
			notUsedUrlQueueVar = new BdbPersistentQueue<String>(bdbDir, bdbName, String.class);
		} catch (ConfigurationException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * getNotUsedUrlAndDelete 不枷锁
	 * @return
	 * @throws Exception
	 */
	public String getNotUsedUrlAndDelete() throws Exception{
		String notUsedUrl = null;
		synchronized (notUsedUrlQueueVar) {
			if(!notUsedUrlQueueVar.isEmpty()){
				notUsedUrl = notUsedUrlQueueVar.poll();
				//显示刷新
				notUsedUrlQueueVar.sync();
			}
		}
		return notUsedUrl;
	}
	
	/**
	 * setNotUsedUrl 不加锁
	 * @param str
	 * @return
	 */
	public boolean setNotUsedUrl(String str){
		boolean flag = false;
		if(!notUsedUrlQueueVar.isContainValue(str)){
			flag = notUsedUrlQueueVar.offer(str);
		}
		return flag;
	}
	
	/**
	 * setNotUsedUrlOfList 不枷锁
	 * @param list
	 * @return
	 */
	public int setNotUsedUrlOfList(List<String> list){
		for(String notUsedUrl:list){
			if(!notUsedUrlQueueVar.isContainValue(notUsedUrl)){
				notUsedUrlQueueVar.offer(notUsedUrl);
			}
		}
		return list.size();
	}
	
	public int getNotUsedUrlSize(){
		return notUsedUrlQueueVar.size();
	}
	
	/**
	 * 获取数据库中所有value，注意数据格式：key-value，需要使用split("-")进行字符串分割
	 * @return
	 */
	public List<String> getAllFromQueue(){
		return notUsedUrlQueueVar.getAllFromQueue();
	}
	
	public boolean isContainsValue(String value){
		return notUsedUrlQueueVar.isContainValue(value);
	}
	
	public boolean isEmpty(){
		return notUsedUrlQueueVar.isEmpty();
	}
	
	public void closeBDB(){
		notUsedUrlQueueVar.close();
	}
	
	public void syncBDB(){
		notUsedUrlQueueVar.sync();
	}
	
	public int getSize(){
		return notUsedUrlQueueVar.size();
	}
	
	/**
	 * 清理,会清空数据库,并且删掉数据库所在目录,慎用.如果想保留数据,请调用close()
	 */
	public void clear(){
		notUsedUrlQueueVar.clear();
	}
	
	public static void main(String[] args) {
		NotUsedUrlQueue sld = new NotUsedUrlQueue();
//		sld.clear();
		System.out.println(sld.getNotUsedUrlSize());
		try {
			System.out.println(sld.getNotUsedUrlAndDelete());
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println(sld.isEmpty());
	}
	
}
